require('dotenv').config();
const express = require('express');
const fetch = require('node-fetch');
const path = require('path');
const schedule = require('node-schedule');
const fs = require('fs');
const config = require('./config.js');

const app = express();


// 中间件配置
app.use(express.json());
app.use(express.static(path.join(__dirname, 'public')));

// 存储用户会话上下文
const userSessions = {};

// 每6小时清理一次上下文
schedule.scheduleJob('0 */6 * * *', () => {
  console.log('执行定时任务：清理所有用户上下文');
  Object.keys(userSessions).forEach(sessionId => {
    // 保存原有的系统提示词
    const systemPrompt = userSessions[sessionId].find(msg => msg.role === 'system');
    // 清空会话但保留系统提示词
    userSessions[sessionId] = systemPrompt ? [systemPrompt] : [];
  });
});

// API路由
app.post('/api/chat', async (req, res) => {
  try {
    const { message, sessionId } = req.body;
    
    if (!message) {
      return res.status(400).json({ error: '消息不能为空' });
    }
    
    // 获取或创建会话
    if (!userSessions[sessionId]) {
      userSessions[sessionId] = [];
      
      // 添加系统提示词（从config.js读取）
      try {
        // 从环境变量获取要使用的callword字段名，默认使用callword3
        const callwordField = process.env.CALLWORD_FIELD
        // 检查config中是否存在指定的callword字段
        if (config && config[callwordField]) {
          userSessions[sessionId].push({
            role: 'system',
            content: config[callwordField]
          });
        }
      } catch (e) {
        console.error('读取系统提示词配置错误:', e);
      }
    }
    
    // 添加用户消息到上下文
    userSessions[sessionId].push({
      role: 'user',
      content: message
    });
    
    // 准备发送到API的消息
    const messages = [...userSessions[sessionId]];
    
    // 调用SiliconFlow API
    const options = {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.API_KEY}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        model: process.env.MODEL ,
        messages: messages,
        stream: false,
        max_tokens: 512,
        temperature: 0.7,
        top_p: 0.7,
        top_k: 50,
        frequency_penalty: 0.5,
        n: 1
      })
    };
    
    const response = await fetch('https://api.siliconflow.cn/v1/chat/completions', options);
    const data = await response.json();
    
    if (data.error) {
      throw new Error(data.error.message || '调用API时出错');
    }
    
    // 提取AI回复
    const aiResponse = data.choices[0].message.content;
    
    // 将AI回复添加到上下文
    userSessions[sessionId].push({
      role: 'assistant',
      content: aiResponse
    });
    
    // 限制上下文长度，防止过长
    if (userSessions[sessionId].length > 20) {
      // 保留最近的对话，但始终保留第一条系统消息（如果有）
      const firstMessage = userSessions[sessionId][0].role === 'system' 
        ? [userSessions[sessionId][0]] 
        : [];
      
      userSessions[sessionId] = [
        ...firstMessage,
        ...userSessions[sessionId].slice(-19 + firstMessage.length)
      ];
    }
    
    res.json({ response: aiResponse });
    
  } catch (error) {
    console.error('API调用错误:', error);
    res.status(500).json({ error: error.message || '服务器内部错误' });
  }
});

// 清除特定会话的上下文
app.post('/api/clear-context', (req, res) => {
  const { sessionId } = req.body;
  
  if (sessionId && userSessions[sessionId]) {
    // 保存原有的系统提示词
    const systemPrompt = userSessions[sessionId].find(msg => msg.role === 'system');
    // 清空会话但保留系统提示词
    userSessions[sessionId] = systemPrompt ? [systemPrompt] : [];
    res.json({ success: true, message: '上下文已清除' });
  } else {
    res.status(400).json({ success: false, message: '无效的会话ID' });
  }
});

// 主页路由
app.get('/', (req, res) => {
  res.sendFile(path.join(__dirname, 'public', 'index.html'));
});
const PORT = process.env.PORT || 3000;
const HOST = '0.0.0.0';
// 启动服务器
app.listen(PORT, HOST,() => {
  console.log(`服务器运行在 http://localhost:${PORT}`);
});